#include<iostream>
#include<queue>
#include<map>
using namespace std;
string mb="123804765";
int fx[4]={1,-1,0,0};
int fy[4]={0,0,1,-1};
map<string,int>m;
struct node{
    int jz;
    string zt;
    int x;
    int y;
    int g;
    node(string x1):zt(x1){
        string bj=mb;
         jz=0;
        for(int i=0;i<9;i++){
            if(zt[i]!=mb[i])jz++;
            if(zt[i]=='0'){
                x=i/3+1;
                y=i%3+1;
            }
        }
        g=0;
    }
    bool operator<(const node & y)const{
        return (jz*0.8+g)>(y.jz*0.8+y.g);
    }
};
priority_queue<node>q;
int main(){
    string x;
    cin>>x;
    q.push(node(x));
    m[x]=0;
    while(!q.empty()){
        node f=q.top();
        q.pop();
        if(f.jz==0){
            cout<<f.g;
            break;
        }
        for(int i=0;i<4;i++){
            int nx=f.x+fx[i];
            int ny=f.y+fy[i];
            if(nx>3||nx<1||ny>3||ny<1)continue;
            string nt=f.zt;
            swap(nt[(nx-1)*3+(ny-1)],nt[(f.x-1)*3+(f.y-1)]);
            if(m.count(nt)==false){
                m[nt]=f.g+1;
                node nn(nt);
                nn.g=f.g+1;
                q.push(nn);
            }
        }
    }
    return 0;
}